Động cơ Decorator pattern

Mô hình UML cho ví dụ về cửa sổ (Window)

Xét một cửa sổ (Window) trong hệ thống giao diện người dùng đồ họa (Graphical User Interface, UI), để cho phép trượt hay cuộn (scroll) trên nội dung của cửa sổ, chúng ta có thể thêm các thanh trượt ngang hoặc thanh trượt dọc vào cửa sổ đó. Giả sử các cửa sổ này được biểu diễn bằng thể hiện của lớp Window, và lớp này không có chức năng thêm thanh trượt. Như vậy, để bổ sung khả năng trượt vào các cửa sổ, chúng ta có thể tạo một lớp con ScrollingWindow cung cấp các chức năng đó, hoặc có thể tạo một lớp ScrollingWindowDecorator đơn thuần thêm chức năng này vào lớp Window có sẵn. Cả hai giải pháp đều được xem là khả thi.

Bây giờ lại giả sử chúng ta muốn thêm các đường biên (border) cho các cửa sổ của chúng ta và một lần nữa, lớp Window gốc không hỗ trợ điều này. Nếu không quan tâm đến việc sửa đổi các thành phần của các lớp đã được tạo, khi này bản thân lớp ScrollingWindow đã tạo ra một kiểu cửa sổ mới, nhưng vẫn như lớp Window gốc là không hỗ trợ tạo các đường biên (chỉ cho phép tạo các thanh trượt). Nếu muốn thêm biên vào tất cả cửa sổ, thông thường chúng ta phải tạo các lớp con WindowWithBorder và ScrollingWindowWithBorder.

Rõ ràng, hướng giải quyết vấn đề này sẽ ngày càng trở lên tồi tệ với mỗi lần tạo thêm nhiều lớp mới khi thêm chức năng. Một giải pháp khác được đưa ra là sử dụng mẫu decorator, ta chỉ cần tạo một lớp mới BorderedWindowDecorator—trong thời gian thực thi (runtime), như vậy ta có thể trang trí cửa sổ có sẵn với ScrollingWindowDecorator hoặc BorderedWindowDecorator hoặc cả hai nếu thấy thích hợp.